package beans;

import org.joda.time.DateTime;

public class BeanHorarios {

    public String consultaDisponibilidade(String dataCandidata,
            String horaCandidata, String duracaoCandidata, String dataAgendada,
            String horaAgendada, String duracaoAgendada) {
        
        String msg = null;
        boolean addMsg = true;
       

         if (dataCandidata.length() < 10 ){
            msg="Formato inv&aacute;lido! Digite uma data no formato dd/mm/aaaa.";
            addMsg = false;
        }else if (horaCandidata.length() < 5) {
            msg="Formato inv&aacute;lido! Digite um hor&aacute;rio no formato HH:mm.";
            addMsg = false;
        }else if (duracaoCandidata.length() < 5){
            msg="Formato inv&aacute;lido! Digite uma dura&ccedil;&atildeo no formato HH:mm.";
            addMsg = false;
        }else{
            
        /*
         todo o bloco abaixo trata das strings passadas
         */
        
        int diaCandidato = Integer.parseInt(dataCandidata.substring(0, 2));
        int mesCanditado = Integer.parseInt(dataCandidata.substring(3, 5));
        int anoCanditado = Integer.parseInt(dataCandidata.substring(6, 10));

        int horaCandidataInicio = Integer.parseInt(horaCandidata.substring(0, 2));
        int minHoraCandidataInicio = Integer.parseInt(horaCandidata.substring(3, 5));

        int horaDuracaoCandidata = Integer.parseInt(duracaoCandidata.substring(0, 2));
        int minDuracaoCandidata = Integer.parseInt(duracaoCandidata.substring(3, 5));

        int diaAgendado = Integer.parseInt(dataAgendada.substring(0, 2));
        int mesAgendado = Integer.parseInt(dataAgendada.substring(3, 5));
        int anoAgendado = Integer.parseInt(dataAgendada.substring(6, 10));

        int horaAgendadaInicio = Integer.parseInt(horaAgendada.substring(0, 2));
        int minHoraAgendadaInicio = Integer.parseInt(horaAgendada.substring(3, 5));

        int horaDuracaoAgendada = Integer.parseInt(duracaoAgendada.substring(0, 2));
        int minDuracaoAgendada = Integer.parseInt(duracaoAgendada.substring(3, 5));

    //cria o objeto DateTime com a data e hora inicial pretendida para agendamento
        DateTime dataInicialCompromissoCandidato = new DateTime(anoCanditado,
                mesCanditado, diaCandidato, horaCandidataInicio, minHoraCandidataInicio);

        /*
         cria o objeto DateTime com a data e hora de termino do compromisso
         pretendido para agendamento
         */
        DateTime dataFinalCompromissoCandidato
                = dataInicialCompromissoCandidato.plusHours(horaDuracaoCandidata).plusMinutes(minDuracaoCandidata);

        //cria o objeto DateTime com a data e hora inicial de um compromisso agendado
        DateTime dataInicialCompromissoAgendado = new DateTime(anoAgendado,
                mesAgendado, diaAgendado, horaAgendadaInicio, minHoraAgendadaInicio);

        /*
         cria o objeto DateTime com a data e hora de termino do compromisso agendado
         */
        DateTime dataFinalCompromissoAgendado
                = dataInicialCompromissoAgendado.plusHours(horaDuracaoAgendada).plusMinutes(minDuracaoAgendada);

        //DateTime que vai retornar data e hora atual do sistema
        DateTime dataAtual = new DateTime();

        
       

        if ((dataInicialCompromissoCandidato.getYear() < dataAtual.getYear())
                && addMsg) {
            msg = "Data a programar &eacute; inv&aacute;lida! Por favor, tente outra data.";
            addMsg = false;
        }
        if ((dataInicialCompromissoCandidato.getYear() == dataAtual.getYear()
                && dataInicialCompromissoCandidato.getMonthOfYear() < dataAtual.getMonthOfYear())
                && addMsg) {
            msg = "Data a programar &eacute; inv&aacute;lida! Por favor, tente outra.";
            addMsg = false;
        }
        if ((dataInicialCompromissoCandidato.getMonthOfYear() == dataAtual.getMonthOfYear()
                && dataInicialCompromissoCandidato.getDayOfMonth() < dataAtual.getDayOfMonth())
                && addMsg) {
            msg = "Data a programar &eacute; inv&aacute;lida! Por favor, tente outra data.";
            addMsg = false;

        }
        if (((dataInicialCompromissoCandidato.getDayOfYear() == dataAtual.getDayOfYear()
                && dataInicialCompromissoCandidato.getHourOfDay() < dataAtual.getHourOfDay())
                || (dataInicialCompromissoCandidato.getDayOfYear() == dataAtual.getDayOfYear()
                && (dataInicialCompromissoCandidato.getHourOfDay() == dataAtual.getHourOfDay()
                && dataInicialCompromissoCandidato.getMinuteOfHour() < dataAtual.getMinuteOfHour())))
                && addMsg) {
            msg = "Hora a programar &eacute; inv&aacute;lida! Por favor, tente um novo hor&aacute;rio.";
            addMsg = false;
        }

        if ((((dataInicialCompromissoCandidato.isAfter(dataInicialCompromissoAgendado)
                || dataInicialCompromissoCandidato.isEqual(dataInicialCompromissoAgendado))
                && (dataInicialCompromissoCandidato.isBefore(dataFinalCompromissoAgendado)))
                || ((dataFinalCompromissoCandidato.isAfter(dataInicialCompromissoAgendado))
                && (dataFinalCompromissoCandidato.isBefore(dataFinalCompromissoAgendado)
                || dataFinalCompromissoCandidato.isEqual(dataFinalCompromissoAgendado)))
                || ((dataInicialCompromissoCandidato.isBefore(dataInicialCompromissoAgendado)
                && dataFinalCompromissoCandidato.isAfter(dataFinalCompromissoAgendado))))
                && addMsg) {
            msg = "Existe compromisso agendado para o per&iacute;odo desejado! Por favor, tente outro per&iacute;odo.";
            addMsg = false;
        }

        if (addMsg) {
            msg = "disponivel";
        }
        }
                 
        return msg;
    }
}
